package qualomelhor.gwt.modules.client;

import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Random;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import com.google.gwt.user.client.Timer;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.FocusWidget;
import com.google.gwt.user.client.ui.Panel;
import com.google.gwt.user.client.ui.Widget;

import qualomelhor.database.Avatar;
import qualomelhor.database.BuscaProduto;
import qualomelhor.database.Categoria;

public class ClientUtils {

	public static final Random rand = new Random((new Date()).getTime());

	
	private static HashMap<String, String> mapTerm = new HashMap<String, String>(0);
	static {
		//term, locale
		mapTerm.put("A melhor forma de fazer comparações ou pesquisas rápidas, eficientes e divertidas no seu site ou blog!_en", "The best way to make comparisons or surveys fast, efficient and fun to your site or blog!");
		mapTerm.put("A melhor forma de fazer comparações rápidas e divertidas!_en", "The best way to make quick comparisons!");
		mapTerm.put("Bem vindo ao QUAL O MELHOR._en", "Welcome to WHICH IS BETTER.");
		mapTerm.put("Categorias_en", "Categories");
		mapTerm.put("Comparar 2 Itens_en", "Compare 2 Items");
		mapTerm.put("Comparar 3 Itens ou Mais_en", "Compare 3 Items or More");
		mapTerm.put("Compartilhe nas redes sociais para saber a opinião dos seus amigos!_en", "Share on social networks to get the opinion of your friends!");
		mapTerm.put("Compartilhe no seu site / blog e ganhe um link de volta!_en", "Share on your site / blog and get a link back!");
		mapTerm.put("Crie comparações rápidas, eficientes e divertidas!_en", "Create quick comparisons, efficient and fun!");
		mapTerm.put("Faça comparações ou pesquisas para promover seu site ou blog!_en", "Make comparisons and surveys to promote your site or blog!");
		mapTerm.put("Idioma:_en", "Language:");
		mapTerm.put("Opinião Sobre 1 Item_en", "Opinion About 1 Item");
		mapTerm.put("Seja bem vindo ao Qual o Melhor!_en", "Welcome to Which is Better!");
		mapTerm.put("Votar neste_en", "Vote this");
		mapTerm.put("beleza_en", "beauty");
		mapTerm.put("capacidade_en", "capacity");
		mapTerm.put("comentário(s)_en", "comment(s)");
		mapTerm.put("contato_en", "contact");
		mapTerm.put("fazer_en", "make");
		mapTerm.put("forma_en", "way");
		mapTerm.put("habilidade_en", "ability");
		mapTerm.put("mapa do site_en", "site map");
		mapTerm.put("melhor_en", "better");
		mapTerm.put("metodo_en", "method");
		mapTerm.put("pessoas_en", "people");
		mapTerm.put("produto_en", "product");
		mapTerm.put("qual_en", "which");
		mapTerm.put("quem_en", "who");
		mapTerm.put("quem somos_en", "who are we");
		mapTerm.put("tecnica_en", "technique");
		mapTerm.put("Últimas comparações:_en", "Latest comparisons:");
		mapTerm.put("A melhor forma de fazer comparações rápidas e divertidas!_en_GB", "The best way to make quick comparisons!");
		mapTerm.put("Aguarde! Enviando..._en_GB", "Wait! Sending ...");
		mapTerm.put("Bem vindo ao QUAL O MELHOR._en_GB", "Welcome to WHICH IS BETTER.");
		mapTerm.put("Categorias_en_GB", "Categories");
		mapTerm.put("Clique e deixe seu voto / opinião sobre _en_GB", "Click and leave your vote / opinion ");
		mapTerm.put("Comentários_en_GB", "Comments");
		mapTerm.put("Comparar 2 Itens_en_GB", "Compare 2 Items");
		mapTerm.put("Comparar 3 Itens ou Mais_en_GB", "Compare 3 Items or More");
		mapTerm.put("Compartilhe nas redes sociais para saber a opinião dos seus amigos!_en_GB", "Share on social networks to get the opinion of your friends!");
		mapTerm.put("Compartilhe no seu site / blog e ganhe um link de volta!_en_GB", "Share on your site / blog and get a link back!");
		mapTerm.put("Criado Por_en_GB", "Created by");
		mapTerm.put("Crie comparações rápidas, eficientes e divertidas!_en_GB", "Create quick comparisons, efficient and fun!");
		mapTerm.put("Facebook Login_en_GB", "Facebook Login");
		mapTerm.put("Idioma:_en_GB", "Language:");
		mapTerm.put("Ocorreu um erro ao postar o comentário. Lamentamos o inconveniente._en_GB", "There was an error posting your comment. Sorry for the inconvenience.");
		mapTerm.put("Ocorreu um erro ao postar seu voto. Lamentamos o inconveniente._en_GB", "There was an error posting your vote. Sorry for the inconvenience.");
		mapTerm.put("Ocorreu um erro ao postar sua comparação. Lamentamos o inconveniente._en_GB", "There was an error posting your comparison. Sorry for the inconvenience.");
		mapTerm.put("Opinião Sobre 1 Item_en_GB", "Opinion About 1 Item");
		mapTerm.put("Resposta adicionada. Obrigado por participar! Compartilhe na sua rede social e saiba a opinião dos seus amigos! Compartilhe no seu blog e ganhe um link de volta!_en_GB", "Answer added. Thanks for participating! Share in your social network and know the opinion of your friends! Share on your blog and get a link back!");
		mapTerm.put("Seja bem vindo ao Qual o Melhor!_en_GB", "Welcome to Which is Better!");
		mapTerm.put("Seu voto foi deletado! Você pode refazer o seu voto agora! Obrigado por participar!_en_GB", "Your vote has been deleted! You can redo your vote now! Thanks for participating!");
		mapTerm.put("Seu voto já foi computado. Efetue o login para alterar seu voto!_en_GB", "Your vote has been counted. Log in to change your vote!");
		mapTerm.put("Sua comparação foi criada! Compartilhe nas redes sociais e tenha a resposta rapidamente!_en_GB", "Your comparison was created! Share on social networks and get the answer quickly!");
		mapTerm.put("Votar neste_en_GB", "Vote this");
		mapTerm.put("Vote e comente!_en_GB", "Vote and comment!");
		mapTerm.put("Voto adicionado! Obrigado por participar! Compartilhe na sua rede social e saiba a opinião dos seus amigos! Compartilhe no seu blog e ganhe um link de volta!_en_GB", "Vote added! Thanks for participating! Share in your social network and know the opinion of your friends! Share on your blog and get a link back!");
		mapTerm.put("Voto foi alterado! Obrigado por participar! Compartilhe na sua rede social e saiba a opinião dos seus amigos! Compartilhe no seu blog e ganhe um link de volta!_en_GB", "Voting was changed! Thanks for participating! Share in your social network and know the opinion of your friends! Share on your blog and get a link back!");
		mapTerm.put("comentário(s)_en_GB", "comment(s)");
		mapTerm.put("contato_en_GB", "contact");
		mapTerm.put("de_en_GB", "of");
		mapTerm.put("mapa do site_en_GB", "site map");
		mapTerm.put("votos anonimos_en_GB", "anonymous votes");
		mapTerm.put("É necessário autorizar o aplicativo para poder postar este evento no facebook!_en_GB", "It is necessary to authorize the app to post this event on facebook!");
		mapTerm.put("É necessário estar logado no facebook para para poder postar este evento!_en_GB", "You must be logged in to facebook to post this event!");
		mapTerm.put("Últimas comparações:_en_GB", "Latest comparisons:");
		mapTerm.put(". Vote deixe sua opinião a respeito._en_US", ". Vote and leave your opinion about.");
		mapTerm.put("A melhor forma de fazer comparações ou pesquisas rápidas, eficientes e divertidas no seu site ou blog!_en_US", "The best way to make comparisons or surveys fast, efficient and fun to your site or blog!");
		mapTerm.put("A melhor forma de fazer comparações rápidas e divertidas!_en_US", "The best way to make comparisons quick and fun!");
		mapTerm.put("Aguarde! Enviando..._en_US", "Wait! Sending ...");
		mapTerm.put("Bem vindo ao QUAL O MELHOR._en_US", "Welcome to WHICH IS THE BETTER.");
		mapTerm.put("Categorias_en_US", "Categories");
		mapTerm.put("Clique e deixe seu voto / opinião sobre _en_US", "Click and leave your vote / opinion ");
		mapTerm.put("Comentários_en_US", "Comments");
		mapTerm.put("Comentários a favor de _en_US", "Comments in favor of ");
		mapTerm.put("Comparar 2 Itens_en_US", "Compare 2 Items");
		mapTerm.put("Comparar 2 Itens_en_US", "Compare 2 Items");
		mapTerm.put("Comparar 2 itens_en_US", "Compare 2 items");
		mapTerm.put("Comparar 3 Itens ou Mais_en_US", "Compare 3 Items or More");
		mapTerm.put("Compare _en_US", "Compare ");
		mapTerm.put("Compartilhe esta comparação na sua rede social e saiba rapidamente o que seus amigos acham!_en_US", "Share this comparison in your social network and find out quickly what your friends think!");
		mapTerm.put("Compartilhe nas redes sociais para saber a opinião dos seus amigos!_en_US", "Share on social networks to get the opinion of your friends!");
		mapTerm.put("Compartilhe no seu site / blog e ganhe um link de volta!_en_US", "Share on your site / blog and get a link back!");
		mapTerm.put("Contato_en_US", "Contact");
		mapTerm.put("Criado Por_en_US", "Created by");
		mapTerm.put("Crie comparações rápidas, eficientes e divertidas!_en_US", "Create quick comparisons, efficient and fun!");
		mapTerm.put("Crie sua comparação com este item_en_US", "Create your comparison with this item");
		mapTerm.put("Crie suas próprias comparações para promover seu blog ou site!_en_US", "Create your own comparisons to promote your blog or website!");
		mapTerm.put("Erro:_en_US", "Error:");
		mapTerm.put("Escolha a categoria_en_US", "Choose a category");
		mapTerm.put("Escolha a categoria:_en_US", "Choose a category:");
		mapTerm.put("Esta comparação foi postada no seu facebook! Enquanto isso, talvez você queira opinar nas seguites comparações abaixo:_en_US", "This comparison was posted on your facebook! Meanwhile, you might want to opine on seguites comparisons below:");
		mapTerm.put("Esta comparação foi postada no seu facebook! Obrigado por participar!_en_US", "This comparison was posted on your facebook! Thanks for participating!");
		mapTerm.put("Faça comparações ou pesquisas para promover seu site ou blog!_en_US", "Make comparisons and surveys to promote your site or blog!");
		mapTerm.put("Idioma:_en_US", "Language:");
		mapTerm.put("Item não encontrado. Lamentamos o inconveniente._en_US", "Item not found. Sorry for the inconvenience.");
		mapTerm.put("Logar com:_en_US", "Log in with:");
		mapTerm.put("Ocorreu um erro ao postar esta ação. Lamentamos o inconveniente._en_US", "An error occurred while posting this action. Sorry for the inconvenience.");
		mapTerm.put("Ocorreu um erro ao postar o comentário. Lamentamos o inconveniente._en_US", "There was an error posting your comment. Sorry for the inconvenience.");
		mapTerm.put("Ocorreu um erro ao postar seu voto. Lamentamos o inconveniente._en_US", "There was an error posting your vote. Sorry for the inconvenience.");
		mapTerm.put("Ocorreu um erro ao postar sua comparação. Lamentamos o inconveniente._en_US", "There was an error posting your comparison. Sorry for the inconvenience.");
		mapTerm.put("Ocorreu um erro ao postar sua comparação: _en_US", "There was an error posting your comparison:");
		mapTerm.put("Opinião Sobre 1 Item_en_US", "Opinion About 1 Item");
		mapTerm.put("Opiniões sobre _en_US", "Comments about ");
		mapTerm.put("Opps.. Você já votou, mas não foi possível localizar seu voto para edição! Lamentamos o inconveniente!_en_US", "Ops .. You have already voted, but can not be found to edit your vote! Sorry for the inconvenience!");
		mapTerm.put("Página não encontrada. Lamentamos o inconveniente._en_US", "Page not found. Sorry for the inconvenience.");
		mapTerm.put("Resposta adicionada. Obrigado por participar! Compartilhe na sua rede social e saiba a opinião dos seus amigos! Compartilhe no seu blog e ganhe um link de volta!_en_US", "Answer added. Thanks for participating! Share in your social network and know the opinion of your friends! Share on your blog and get a link back!");
		mapTerm.put("Saiba sobre_en_US", "Learn about");
		mapTerm.put("Seja bem vindo ao Qual o Melhor!_en_US", "Welcome to Which is Better!");
		mapTerm.put("Seu browser não possui capacidade sufiente para exibir este site! Que tal atualizar para as versões mais modernas?_en_US", "Your browser does not have enough capabilities to view this site! What about upgrade to the latest versions?");
		mapTerm.put("Seu comentário foi incluído no facebook! Obrigado por participar!_en_US", "Your comment has been included on facebook! Thanks for participating!");
		mapTerm.put("Seu voto foi deletado! Você pode refazer o seu voto agora! Obrigado por participar!_en_US", "Your vote has been deleted! You can redo your vote now! Thanks for participating!");
		mapTerm.put("Seu voto já foi computado. Efetue o login para alterar seu voto!_en_US", "Your vote has been counted. Log in to change your vote!");
		mapTerm.put("Sua comparação foi criada! Compartilhe nas redes sociais e tenha a resposta rapidamente!_en_US", "Your comparison was created! Share on social networks and get the answer quickly!");
		mapTerm.put("Ultimas comparações deste produto_en_US", "Latest comparisons of this product");
		mapTerm.put("Voltar_en_US", "Back");
		mapTerm.put("Votar neste_en_US", "Vote this");
		mapTerm.put("Vote deixe sua opinião a respeito!_en_US", "Vote leave your opinion about it!");
		mapTerm.put("Vote e comente!_en_US", "Vote and comment!");
		mapTerm.put("Vote e deixe seu comentário!_en_US", "Vote and leave your comments!");
		mapTerm.put("Voto adicionado! Obrigado por participar! Compartilhe na sua rede social e saiba a opinião dos seus amigos! Compartilhe no seu blog e ganhe um link de volta!_en_US", "Vote added! Thanks for participating! Share in your social network and know the opinion of your friends! Share on your blog and get a link back!");
		mapTerm.put("Voto foi alterado! Obrigado por participar! Compartilhe na sua rede social e saiba a opinião dos seus amigos! Compartilhe no seu blog e ganhe um link de volta!_en_US", "Voting was changed! Thanks for participating! Share in your social network and know the opinion of your friends! Share on your blog and get a link back!");
		mapTerm.put("beleza_en_US", "beauty");
		mapTerm.put("capacidade_en_US", "capacity");
		mapTerm.put("com outros itens!_en_US", "with other items!");
		mapTerm.put("comentário(s)_en_US", "comment(s)");
		mapTerm.put("comparação_en_US", "comparison");
		mapTerm.put("contato_en_US", "contact");
		mapTerm.put("contato_en_US", "contact");
		mapTerm.put("de_en_US", "of");
		mapTerm.put("fazer_en_US", "make");
		mapTerm.put("forma_en_US", "way");
		mapTerm.put("habilidade_en_US", "ability");
		mapTerm.put("mapa do site_en_US", "site map");
		mapTerm.put("mapa do site_en_US", "site map");
		mapTerm.put("melhor_en_US", "better");
		mapTerm.put("metodo_en_US", "method");
		mapTerm.put("ou_en_US", "or");
		mapTerm.put("pessoas_en_US", "people");
		mapTerm.put("produto_en_US", "product");
		mapTerm.put("qual_en_US", "which");
		mapTerm.put("qual o melhor_en_US", "which is better");
		mapTerm.put("quem_en_US", "who");
		mapTerm.put("tecnica_en_US", "technique");
		mapTerm.put("votos anonimos_en_US", "anonymous votes");
		mapTerm.put("É necessário autorizar a publicação de ações para para poder postar este evento no seu facebook!_en_US", "It is necessary to authorize the publication of actions to be able to post this event on your facebook!");
		mapTerm.put("É necessário autorizar o aplicativo para poder postar este evento no facebook!_en_US", "It is necessary to authorize the app to post this event on facebook!");
		mapTerm.put("É necessário estar logado no facebook para para poder postar este evento!_en_US", "You must be logged in to facebook to post this event!");
		mapTerm.put("Últimas comparações:_en_US", "Latest comparisons:");
		mapTerm.put("quem somos_zh_CN", "?????");
	}

    public static String getConstant(String term, String locale) {
    	String result = mapTerm.get(term + "_" + locale);
    	if (result == null) {
    		result = term;
    	}
    	return result;
    }

	public static String converteEmLink(String texto) {
		String txt = removeAcentuacao(texto);
		txt = txt.replaceAll(" ", "-");
		txt = removeCaracteresInvalidos(txt);
		txt = txt.replaceAll("[\\-\\-]+", "-");
		System.out.println("link parcial:[" + txt + "]");
		System.out.println("txt.char1:[" + txt.charAt(0) + "]");
		if (txt.charAt(0) == '-') {
			txt = txt.substring(1);
		}
		System.out.println("link parcial:[" + txt + "]");
		return txt;
	}

	public static String converteEmTexto(String link) {
		return link.replaceAll("-", " ").replaceAll("_", "-");
	}

	public static Categoria getCategoriaById(ArrayList<Categoria> listCategoria, Long id) {
		Categoria c = null;
		for (int i = 0; i < listCategoria.size(); i++) {
			if (listCategoria.get(i).getId().equals(id)) {
				c = listCategoria.get(i);
				break;
			}
		}
		return c;
	}

	public static Categoria getCategoriaByName(ArrayList<Categoria> listCategoria, String nomeCat) {
		Categoria c = null;
		for (int i = 0; i < listCategoria.size(); i++) {
			if (listCategoria.get(i).getNomeCategoria().equals(nomeCat)) {
				c = listCategoria.get(i);
				break;
			}
		}
		return c;
	}

	public static BuscaProduto getProdutoExato(ArrayList<BuscaProduto> listBusca, String nomeProduto) {
		BuscaProduto p = null;
		for (int i = 0; i < listBusca.size(); i++) {
			if (listBusca.get(i).getId().equals(nomeProduto)) {
				p = listBusca.get(i);
				break;
			}
		}
		return p;
	}

	public static int getRandom(int max) {
		int randnum = rand.nextInt(max) + 1;
		return randnum;
	}

	public static Avatar getRandomAvatar() {
		Avatar av = new Avatar(1, ClientUtils.getRandom(Avatar.ParteCorpo.NUM_CABELOS.getNumPartes()), ClientUtils.getRandom(Avatar.ParteCorpo.NUM_SOMBRANCELHAS.getNumPartes()), ClientUtils.getRandom(Avatar.ParteCorpo.NUM_OLHOS.getNumPartes()), ClientUtils.getRandom(Avatar.ParteCorpo.NUM_BOCAS.getNumPartes()), ClientUtils.getRandom(Avatar.ParteCorpo.NUM_ROUPAS.getNumPartes()), ClientUtils.getRandom(Avatar.ParteCorpo.NUM_MAOS.getNumPartes()), ClientUtils.getRandom(Avatar.ParteCorpo.NUM_CHEEKS.getNumPartes()));
		av.setId(0L);
		return av;
	}

	public static void trocaWidget(final Widget wdget1, final Widget wdget2, final String parentType, final int param1, final int param2, final boolean focusOnChange, final boolean animarCrescimento, final int widthDestino) {
		
		class ContadorTempo {
			public double opacityTroca = 1;		
		};
		
		final ContadorTempo contTempo = new ContadorTempo();
		
		contTempo.opacityTroca = 1;
		final Panel parent = (Panel)wdget1.getParent();
		final Timer timerOpacityDown = new Timer() {
			@Override
			public void run() {
				//System.out.println("executando timeropacity...");
				//System.out.println("contTempo.opacityTroca = " + contTempo.opacityTroca);
				if (contTempo.opacityTroca > 0) {
					contTempo.opacityTroca -= 0.1;
					/*
					if (animarCrescimento && wdget1.getOffsetWidth() > widthDestino * opacityTroca) {
						if (parentType.equals("flextable")) {
							((FlexTable)parent).getFlexCellFormatter().setWidth(param1, param2, (widthDestino * opacityTroca) + "px");
						} else {
							parent.setWidth((widthDestino * opacityTroca) + "px");
						}
						wdget1.setWidth((widthDestino * opacityTroca) + "px");
					}
					*/
					wdget1.getElement().getStyle().setOpacity(contTempo.opacityTroca);
				} else {
					this.cancel();
					/*
					if (parentType.equals("flextable")) {
						((FlexTable)parent).getFlexCellFormatter().setWidth(param1, param2, wdget1.getOffsetWidth() + "px");
					} else {
						parent.setWidth(wdget1.getOffsetWidth() + "px");
					}
					*/
					parent.remove(wdget1);
					wdget2.getElement().getStyle().setOpacity(0);
					if (parentType.equals("flextable")) {
						((FlexTable)parent).setWidget(param1, param2, wdget2);
					} else {
						parent.add(wdget2);
					}
					final Timer timerOpacityUP = new Timer() {

						@Override
						public void run() {
							if (contTempo.opacityTroca <= 1) {
								contTempo.opacityTroca += 0.1;
								wdget2.getElement().getStyle().setOpacity(contTempo.opacityTroca);
								if (animarCrescimento) {
									if (parentType.equals("flextable")) {
										((FlexTable)parent).getFlexCellFormatter().setWidth(param1, param2, (widthDestino * contTempo.opacityTroca) + "px");
									} else {
										parent.setWidth((widthDestino * contTempo.opacityTroca) + "px");
									}
									wdget2.setWidth((widthDestino * contTempo.opacityTroca) + "px");
								}
							} else {
								this.cancel();
								if (focusOnChange) {
									((FocusWidget)wdget2).setFocus(true);
								}
								//Window.alert("teste");
							}
						}
					};
					timerOpacityUP.scheduleRepeating(50);
				}
			}
		};
		timerOpacityDown.scheduleRepeating(50);
	}

	public static void trocaWidgetWithFunction(final Widget wdget1, final Callable func, final Widget wdget2, final String parentType, final int param1, final int param2, final boolean focusOnChange, final boolean animarCrescimento, final int widthDestino, final int tempoTroca, final boolean removeWidgetOnFadeOut, final int callMeio_Fim /* call no meio = 1, call no fim = 2 */) {
		
		class ContadorTempo {
			public double opacityTroca = 1;		
		};
		
		final ContadorTempo contTempo = new ContadorTempo();
		
		contTempo.opacityTroca = 1;
		final Panel parent = (Panel)wdget1.getParent();
		final Timer timerOpacityDown = new Timer() {
			@Override
			public void run() {
				//System.out.println("executando timeropacity...");
				//System.out.println("contTempo.opacityTroca = " + contTempo.opacityTroca);
				if (contTempo.opacityTroca > 0) {
					contTempo.opacityTroca -= 0.1;
					/*
					if (animarCrescimento && wdget1.getOffsetWidth() > widthDestino * opacityTroca) {
						if (parentType.equals("flextable")) {
							((FlexTable)parent).getFlexCellFormatter().setWidth(param1, param2, (widthDestino * opacityTroca) + "px");
						} else {
							parent.setWidth((widthDestino * opacityTroca) + "px");
						}
						wdget1.setWidth((widthDestino * opacityTroca) + "px");
					}
					*/
					wdget1.getElement().getStyle().setOpacity(contTempo.opacityTroca);
				} else {
					this.cancel();
					if (removeWidgetOnFadeOut) {
						parent.remove(wdget1);
					}
					if (wdget2 == null) {
						func.call();
					} else {
						wdget2.getElement().getStyle().setOpacity(0);
						
						if (callMeio_Fim == 1) {
							func.call();
						}

						if (parentType.equals("flextable")) {
							((FlexTable)parent).setWidget(param1, param2, wdget2);
						} else {
							parent.add(wdget2);
						}
						final Timer timerOpacityUP = new Timer() {
							@Override
							public void run() {
								if (contTempo.opacityTroca <= 1) {
									contTempo.opacityTroca += 0.1;
									wdget2.getElement().getStyle().setOpacity(contTempo.opacityTroca);
									if (animarCrescimento) {
										if (parentType.equals("flextable")) {
											((FlexTable)parent).getFlexCellFormatter().setWidth(param1, param2, (widthDestino * contTempo.opacityTroca) + "px");
										} else {
											parent.setWidth((widthDestino * contTempo.opacityTroca) + "px");
										}
										wdget2.setWidth((widthDestino * contTempo.opacityTroca) + "px");
									}
								} else {
									this.cancel();
									if (focusOnChange) {
										((FocusWidget)wdget2).setFocus(true);
									}
									if (callMeio_Fim == 2) {
										func.call();
									}
									//Window.alert("teste");
								}
							}
						};
						timerOpacityUP.scheduleRepeating(tempoTroca);
					}
				}
			}
		};
		timerOpacityDown.scheduleRepeating(tempoTroca);
	}

	public static void fadeInWidgetWithFunctionOrNot(final Widget wdget1, final Callable func, final boolean focusOnFinish) {

		class ContadorTempo {
			public double opacityTroca = 1;		
		};

		final ContadorTempo contTempo = new ContadorTempo();

		contTempo.opacityTroca = 0;
		final Timer timerOpacityUp = new Timer() {
			@Override
			public void run() {
				if (contTempo.opacityTroca < 1) {
					contTempo.opacityTroca += 0.1;
					wdget1.getElement().getStyle().setOpacity(contTempo.opacityTroca);
				} else {
					this.cancel();
					if (func != null) {
						func.call();
					}
					if (focusOnFinish) {
						((FocusWidget)wdget1).setFocus(true);
					}
				}
			}
		};
		timerOpacityUp.scheduleRepeating(50);
	}

    public static long dateDiffInSeconds(Date d1, Date d2) {
    	long milliseconds1 = d1.getTime();
    	long milliseconds2 = d2.getTime();
    	long diff = milliseconds2 - milliseconds1;
    	long diffSeconds = diff / 1000;
    	//long diffMinutes = diff / (60 * 1000);
    	//long diffHours = diff / (60 * 60 * 1000);
    	//long diffDays = diff / (24 * 60 * 60 * 1000);
    	return diffSeconds;
    }

    public static String removeAcentuacao(String text) {  
        String result = text;
    	if (text != null) {
            return text;
        }
        char[] acentuados = new char[] { 'ç', 'á', 'à', 'ã', 'â', 'ä', 'é', 'è', 'ê', 'ë', 'í', 'ì', 'î', 'ï', 'ó', 'ò', 'õ', 'ô', 'ö', 'ú', 'ù', 'û', 'ü' };  
      
        char[] naoAcentuados = new char[] { 'c', 'a', 'a', 'a', 'a', 'a', 'e', 'e', 'e', 'e', 'i', 'i', 'i', 'i', 'o', 'o', 'o', 'o', 'o', 'u', 'u', 'u', 'u' };  

        for (int i = 0; i < acentuados.length; i++) {  
            result = result.replace(acentuados[i], naoAcentuados[i] );   
        }  
        return result;
    }

    public static String removeCaracteresInvalidos(String text) {
        String result = text.replaceAll("[^0-9a-zA-Z-_]+", "");
        return result;    	
    }

    public static String lerTag(String str, String tag) {
    	String result;
    	String tagIni = "<" + tag + ">";
    	String tagFim = "</" + tag + ">";
    	result = str.substring(str.indexOf(tagIni) + tagIni.length(), str.indexOf(tagFim));
    	return result;
    }
}